/*
 * @(#)AgeRoutePredicateFactory.java 2021年3月11日
 *
 * Copyright (c) 2010 by rayootech.com. All rights reserved.
 */
package com.nuctech.gateway.predicates;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 限制年龄路由断言工厂，有两个要求
 * 1、名字必须【配置名+RoutePredicateFactory】
 * 2、必须继承AbstractRoutePredicateFactory<配置类>
 * 
 * @author lilu
 * @date 2021年3月11日
 * @since 1.0.0
 */
@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {
	
	public AgeRoutePredicateFactory() {
		super(AgeRoutePredicateFactory.Config.class);
	}
	
	/**
	 * 用于从配置文件中获取参数值赋值到配置类中的属性上
	 * @see org.springframework.cloud.gateway.support.ShortcutConfigurable#shortcutFieldOrder()
	 */
	@Override
	public List<String> shortcutFieldOrder() {
		// 这里的顺序要跟配置文件中的参数顺序一致
		return Arrays.asList("minAge", "maxAge");
	}

	/**
	 * 断言逻辑
	 * @see org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory#apply(java.lang.Object)
	 */
	@Override
	public Predicate<ServerWebExchange> apply(Config config) {
		return new Predicate<ServerWebExchange>() {
			@Override
			public boolean test(ServerWebExchange exchange) {
				// 1、接收前台传入的age参数
				String ageStr = exchange.getRequest().getQueryParams().getFirst("age");
				// 2、判断是否为空
				if (StrUtil.isNotBlank(ageStr)) {
					// 3、如果不为空，再进行路由逻辑判断
					int age = Integer.parseInt(ageStr);
					return (age < config.getMaxAge() && age > config.getMinAge());
				}
				return false;
			}
		};
	}

	/**
	 * 配置类，用于接收配置文件中的对应参数
	 * 
	 * @author lilu
	 * @date 2021年3月12日
	 * @since 1.0.0
	 */
	@Data
	@NoArgsConstructor
	public static class Config {
		private int minAge;
		private int maxAge;
	}
	
}


